home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / animatin / anim_q2z / statusdm / articles / assembly.asc < prev    next >
Text File  |  1995-04-26  |  13KB  |  242 lines

  1. *******************************************************************************
  2. *                            STatus Disk Magazine                             *
  3. *                             Issue 1, Volume 1                               *
  4. *                                                                             *
  5. * NOTE:  This issue is to be copied freely by Atari ST users.  We at STatus   *
  6. * strictly prohibit anyone selling this issue as part of a Shareware or PD    *
  7. * collection.                                                                 *
  8. *                                                                             *
  9. *                            STatus Disk Magazine                             *
  10. *                            Suite 299                                        *
  11. *                            4431 Lehigh Road                                 *
  12. *                            College Park, MD  20740                          *
  13. *                                                                             *
  14. * STatus Disk Magazine (c) 1989, is a COMMERCIAL effort.                      *
  15. *******************************************************************************
  16.  
  17.                     Assembly Language Tutorial
  18.  
  19.  
  20.             Graphics, Part One:  Higher Level/GEM usage
  21.  
  22.  
  23.         One of my aspirations is the make a video game.  Whether 
  24.    or  not  people  percieve  the Atari  ST/Mega  line  as  game 
  25.    machines to me is irrelevant, because to me, entertainment is 
  26.    one of the top uses of any computer I buy.
  27.  
  28.         Now keeping this in mind, remember, I'm probably as much 
  29.    a beginner  in  assembly programming as anyone who is reading 
  30.    this.  So what makes me able to teach anyone? 
  31.  
  32.         Well, nothing actually, except that I'm learning it WITH
  33.    you!  The code in this article may not be the most efficient, 
  34.    and  if you have any helpful hints or tips,  forward them  to 
  35.    me.   The  reason  I  think this will all  be  more  fun  and 
  36.    interesting  is  because  I will take the time  to  help  the 
  37.    beginners while trying to push the vanguard with some of  the 
  38.    more dedicated hackers.
  39.  
  40.         Okay, enough prattling, let's get down to business.
  41.  
  42.         The first thing I am going to say is this:   Until I can 
  43.    find  some good documentation on the use of VRT_CPYFM  (  the 
  44.    transparent  raster  copy ),  I cannot say  that  multi-color 
  45.    sprite-like graphics is impossible,  but it sure is NOT easy! 
  46.    Many  options  can be tried:   You can try using  the  Line-A 
  47.    sprites  and "layering" them,  you can try the Line-A  BitBlk 
  48.    routine,  or,  if it is indeed possible,  layer rasters using 
  49.    the  vrt_cpyfm function (VDI opcode is 121) but  the  obvious 
  50.    problem is defining a single color source, which is something 
  51.    I decided to forego.   Judging from the demands players today 
  52.    place  on the computer game,  it is most likely that  in  the 
  53.    ST  world,  programmers have been using their own  customized 
  54.    routines which handle the graphics in a sprite-like manner.
  55.  
  56.         But  what about getting our feet wet and mucking  around 
  57.    with some of the higher level raster functions first?   Let's 
  58.    do it!
  59.  
  60.         I  chose  to use vro_cpyfm for this program (  which  is 
  61.    contained in RUN_MAN.ARC ),  since I wanted to keep it simple 
  62.    and  allow for learning the necessary criteria for  making  a 
  63.    "blit".   The reason it is so simple for what we're doing  is 
  64.    that we're literally booting up a DEGAS picture into an  area 
  65.    of  memory,  and getting the images we want from a series  of 
  66.    drawings in it, and vro_cpyfm will handle all four bit-planes 
  67.    with a single call.
  68.  
  69.         The  first thing I always do within a program like  this 
  70.    is  use  the  GEM m_alloc call to set  aside  memory  for  my 
  71.    graphic screens.   In this case we need at least 96000 bytes, 
  72.    since we have two screens which are going to be "flipped"  so 
  73.    as not to have flickering animation, and a third screen which 
  74.    contains the raster data we're using.
  75.  
  76.         The next thing is to set the resolution.   When you  use 
  77.    GEM and set the resolution to a new value within the program, 
  78.    dialog boxes,  alert boxes, drop downs, etc... all still work 
  79.    in the original resolution.   But for this program, with none 
  80.    of that in use, it really doesn't matter!     
  81.  
  82.         Booting up a DEGAS picture is quite easy.  The format of 
  83.    a DEGAS pic is:
  84.  
  85.         2     bytes    -    resolution
  86.         32    bytes    -    palette (the RGB values of the 16 colors)
  87.         32000 bytes    -    screen data
  88.         32    bytes    -    animation information, used by DEGAS 
  89.                             Elite only.  
  90.  
  91.         The total length of the file is 32034 bytes in  original 
  92.    DEGAS format,  and 32066 bytes in DEGAS  Elite,  Uncompressed 
  93.    format.   Looking  at the source code,  you can see how I  go 
  94.    about  booting  the  picture  in  and  setting  the   palette 
  95.    properly.  I have written macros that open the file ( f_open), 
  96.    move  the  file  pointer  ( f_seek  ),  read  from  the  file 
  97.    (  f_read ),  and close the file ( f_close ).   All of  these 
  98.    correspond to the proper GEMDOS calls.   If you wish to delve 
  99.    into files and how to handle them, examine the macros as they 
  100.    are well commented.
  101.  
  102.         Now here is the good part.   According to every book  on 
  103.    how  to do a raster copy,  you have to set  up  MFDBs.   Some 
  104.    people  look  at  the  abbreviation  and  immediately   enter 
  105.    catatonic shock and one friend of mine actually stopped using 
  106.    his  ST and began chanting meaningless things about  how  his 
  107.    C128 was never like this....
  108.  
  109.         MFDBs  are simply Memory Form  Definition  Blocks.   The 
  110.    name is still complicated enough that most people think  they 
  111.    will  need  a  bullwhip  and  a  fedora  to  deal  with   the 
  112.    programming aspect of it in assembly.
  113.  
  114.         This is where the C user starts to giggle and whips  out 
  115.    his TYPE DEF STRUCT command...
  116.  
  117.         Well,  here's all you need to do to define an MFDB,  and 
  118.    its there in my code:
  119.  
  120.    MFDB:                         name of the MFDB for our purposes
  121.    address        ds.l 1         address of the screen data  for 
  122.                                  to associate with this MFDB
  123.    widthnpix      ds.w 1         width of the raster  image  in 
  124.                                  pixels.  ALWAYS 320 in low rez, 
  125.                                  or 640 in medium and high rez.
  126.    heightnpix     ds.w 1         height of the raster in pixels, 
  127.                                  which  is 200 in low or  medium 
  128.                                  rez, and 400 in high rez.
  129.    widthnwords    ds.w 1         the widthnpix divided by 16.
  130.    formflag       ds.w 1         the  form  flag,   usually   1, 
  131.                                  according  to  the  DevPac   ST 
  132.                                  manual.
  133.    numofplanes    ds.w 1         number of bit planes in raster.
  134.                                  4 = low rez
  135.                                  2 = medium rez
  136.                                  1 = monochrome
  137.    reserved       ds.w 3         three reserved words, set to 0.
  138.  
  139.  
  140.         Essentially,  its  ideal to set up all your MFDBs to  be 
  141.    identical except for the address of the screen.  All of these 
  142.    parameters are easily either calculated or returned from  GEM 
  143.    inquiry functions if your program must be adaptable.
  144.  
  145.         However,  none of that really will matter with trying to 
  146.    move a little guy across your SC1224...
  147.  
  148.         Now,  when  messing with with the MFDB,  you'll set  the 
  149.    values to whatever is appropriate.   In my code, you'll see I 
  150.    set  that  up before I begin messing with the  actual  raster  
  151.    copying.  Also, in case you're wondering, all the MFDB really 
  152.    holds  are parameters for the screens you're  copying  either 
  153.    from or to.  Easily enough done.
  154.  
  155.         But  wait...don't you want to tell it WHERE to  get  and 
  156.    send  all this graphic data?   That's where the PTSIN  arrays 
  157.    come in.   This is actually quite easy,  and the format is as 
  158.    follows:
  159.  
  160.         PTSIN     -    x coordinate of upper left corner, source
  161.         PTSIN+2   -    y coordinate of "   "   "   "  "   "   "
  162.         PTSIN+4   -    x  coordinate  of  lower  right   corner,     
  163.                        source
  164.         PTSIN+6   -    y  coordinate  of  lower  right   corner, 
  165.                        source
  166.  
  167.         PTSIN+8 to PTSIN+14 are the same parameters,  but  apply 
  168.    to  the  destination raster.   Essentially,  to copy  from  a 
  169.    raster  whose  coordinates are (200,100,231,131)  to  another 
  170.    location, such as (26,92,57,123), you'd set it up like:
  171.  
  172.             move.w     #200,ptsin
  173.             move.w     #100,ptsin+2
  174.             move.w     #231,ptsin+4
  175.             move.w     #131,ptsin+6
  176.  
  177.             move.w     #26,ptsin+8
  178.             move.w     #92,ptsin+10
  179.             move.w     #57,ptsin+12
  180.             move.w     #123,ptsin+14
  181.  
  182.  
  183.         There  is another parameter to worry about  also.   That 
  184.    is,  the raster mode.   To make it short and sweet,  none  of 
  185.    this  really helps you if you're trying to make  them  handle 
  186.    like sprites.   Mode #6 is good for a single raster that  you 
  187.    want to erase by ANDing it with itself,  but on a screen full 
  188.    of  objects,  some  of which will overlap,  you may  want  to 
  189.    confine  yourself to mode #3 for displaying it,  and mode  #0 
  190.    for erasing it.   Or,  you can even perform a v_clrwk as long 
  191.    as  you  know that what you want to erase is on  the  logical 
  192.    screen.
  193.  
  194.         Now for the juicy part...
  195.  
  196.         If you look at the DEGAS picture,  you'll see the man is 
  197.    in  different  parts of the screen.   We want to  cycle  back 
  198.    and forth between the rasters used, and the way to do that is 
  199.    to  associate  each  step  in the "cycle"  with  one  of  the 
  200.    possible  rasters  and  its  coordinates.    That  could  get 
  201.    complicated,  so I split it into two sections.  One loop goes 
  202.    through  all the rasters from left to right,  and the  second 
  203.    one  goes back ( right to left ) through all but  the  raster 
  204.    farthest  left  and the raster farthest right in  the  image.  
  205.    The reason is simple:   The first loop shows those two images 
  206.    already,  so  if we did it twice,  those images would  appear 
  207.    TWICE, not once, like all the others.
  208.  
  209.         As  all of this is happening,  we have adding to  the  x 
  210.    coordinates  of  where to put the image  on  screen.   If  we 
  211.    don't,  he'll  appear to be running in place.   As we add  to 
  212.    that, each loop either will add or subtract the x coordinates 
  213.    of  where to look for the proper raster to display  as  well! 
  214.    This  effectively cycles the necessary rasters  while  moving 
  215.    the destination across the screen, from left to right.
  216.  
  217.         Now,  how do we make all of this flicker-free?   We  all 
  218.    know  that  the  supposed  graphic  wunderkind,   the  Amiga, 
  219.    flickers!   And  the last thing you need is to have  your  ST 
  220.    flicker like an Amiga!   So....   looking in my loops, you'll 
  221.    note  that after I set up the proper x coordinates  into  the 
  222.    ptsin arrays for the source and destination rasters,  I  copy 
  223.    the raster to the LOGICAL screen,  which is NOT being  shown. 
  224.    Once it is shown,  I can erase the previous screen,  which is 
  225.    now the logical screen with a v_clrwk.   To make sure none of 
  226.    this  occurs before the screen I want is displayed,  I  do  a 
  227.    XBCALL #37,2,  which, to my macros, is just saying to perform 
  228.    XBIOS  37  and fix the stack by 2 bytes.   XBIOS  37  is  the 
  229.    V_sync call and its purpose is to stall things until the  VBL 
  230.    (  vertical  blank  ).   This assures you  that  you'll  have 
  231.    flicker-free animation.
  232.  
  233.         Some obvious improvements can be made in this  code.   I 
  234.    could,  for example,  do comparisons and determine the proper 
  235.    source  raster  from that,  so as not to  use  two  seperate, 
  236.    distinct  loops  within  a larger  loop  ( which  essentially 
  237.    keeps the whole thing going coherently!  ).   If you want to, 
  238.    you  can make him run faster or slower by usign  more  XBCALL 
  239.    #37,2 's in that section.  Right now, he runs pretty fast...
  240.  
  241.  
  242.